package com.oristartech.ori.common.mapper;

import java.io.Serializable;
import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import com.oristartech.ori.common.mybatis.Criteria;

/**
 * 通用Mapper接口
 * 
 * @author chenfenghai
 * @date 2019/02/28
 */
@Mapper
public interface OrstMapper<T> {

    /**
     * 插入一条记录
     * 
     * @param entity
     *            实体对象
     * @return
     */
    public int insert(T entity);

    /**
     * 批量插入记录
     * 
     * @param list
     */
    public void batchInsert(List<T> list);

    /**
     * 插入一条记录，存在有效值的字段
     * 
     * @param entity
     * @return
     */
    public int insertSelective(T entity);

    /**
     * 批量插入记录，存在有效值的字段
     * 
     * @param list
     */
    public void batchInsertSelective(List<T> list);

    /**
     * 根据 ID删除记录
     * 
     * @param id
     *            主键ID
     * @return
     */
    public int deleteById(Serializable id);

    /**
     * 批量根据 ID删除记录
     * 
     * @param list
     */
    public void batchDeleteById(List<Long> list);

    /**
     * 根据 UID删除记录
     * 
     * @param uid
     * @return
     */
    public int deleteByUid(String uid);

    /**
     * 批量根据 UID删除记录
     * 
     * @param list
     */
    public void batchDeleteByUid(List<String> list);

    /**
     * 根据 ID修改记录
     * 
     * @param entity
     * @return
     */
    public int updateById(T entity);

    /**
     * 批量根据 ID修改记录
     * 
     * @param list
     */
    public void batchUpdateById(List<T> list);

    /**
     * 根据ID修改实体对象有效值的字段
     * 
     * @param entity
     * @return
     */
    public int updateSelectiveById(T entity);

    /**
     * 批量根据ID修改实体对象有效值的字段
     * 
     * @param list
     */
    public void batchUpdateSelectiveById(List<T> list);

    /**
     * 根据UID修改记录
     * 
     * @param entity
     * @return
     */
    public int updateByUid(T entity);

    /**
     * 批量根据UID修改记录
     * 
     * @param list
     */
    public void batchUpdateByUid(List<T> list);

    /**
     * 根据UID修改实体对象有效值的字段
     * 
     * @param entity
     * @return
     */
    public int updateSelectiveByUid(T entity);

    /**
     * 批量根据UID修改实体对象有效值的字段
     * 
     * @param list
     */
    public void batchUpdateSelectiveByUid(List<T> list);

    /**
     * 根据条件修改实体对象有效值的字段
     * 
     * @param entity
     * @param criteria
     * @return
     */
    public int updateSelective(@Param("entity") T entity, @Param("criteria") Criteria criteria);

    /**
     * 根据 ID查询记录
     * 
     * @param id
     * @return
     */
    public T selectById(Serializable id);

    /**
     * 根据 UID查询记录
     * 
     * @param uid
     * @return
     */
    public T selectByUid(String uid);

    /**
     * 根据对象有效值查询列表
     * 
     * @param entity
     * @return
     */
    public List<T> selectListSelective(T entity);

    /**
     * 根据对象有效值查询一条记录
     * 
     * @param entity
     * @return
     */
    public T selectOneSelective(T entity);

    /**
     * 根据条件查询一条记录
     * 
     * @param criteria
     * @return
     */
    public T selectOne(Criteria criteria);

    /**
     * 根据条件查询列表
     * 
     * @param criteria
     * @return
     */
    public List<T> selectList(Criteria criteria);
}
